///////////////////////////////////////////////////////////////////////////////
// Includes
#include <i2c.h>
#include <drvI2C.h>
#include <drvIOConfig.h>

///////////////////////////////////////////////////////////////////////////////
// Initialize I2C driver
void drvI2CInit(void)
{
	I2C_SCL = INPUT_PIN;
	I2C_SDA = INPUT_PIN;
	OpenI2C(MASTER, SLEW_ON);
	SSPADD = sysCLOCK_FREQUENCY / drvI2C_BAUD_RATE / 4 - 1;
}

///////////////////////////////////////////////////////////////////////////////
// Issue start condition (true if start was acknowledged)
dosBool drvI2CStart(drvI2CRWMode in_mode, dosByte in_address)
{
	dosBool retval;

	StartI2C();

	// Transmit the address byte
	return drvI2CWriteByte((in_address << 1) | ((dosByte)in_mode)) == 0;
}

///////////////////////////////////////////////////////////////////////////////
// Sends Restart condition
dosBool drvI2C3Restart(drvI2CRWMode in_mode, dosByte in_address)
{
	RestartI2C();

	// Transmit the address byte
	return drvI2CWriteByte((in_address << 1) | ((dosByte)in_mode)) == 0;
}

///////////////////////////////////////////////////////////////////////////////
// Issue stop condition
void drvI2CStop(void)
{
	StopI2C();
}

///////////////////////////////////////////////////////////////////////////////
// Sends data byte
dosBool drvI2CWriteByte(dosByte in_data)
{
	SSPBUF = in_data;
	IdleI2C();

	return (SSPCON2bits.ACKSTAT);
}

///////////////////////////////////////////////////////////////////////////////
// Reads one byte from the bus
dosByte drvI2CReadByte(drvI2CACK in_ack)
{
	dosByte data;

	data = ReadI2C();

	if(in_ack == drvI2C_ACK)
	{
		AckI2C();
	}
	else
	{
		NotAckI2C();
	}

	return data;
}